要明白的知识点

  1. 在哪里定义APP_ENV这个环境变量,它有什么作用,它与环境文件什么关系
  2. 在哪里定义应用的环境
  3. 了解环境文件路径,环境文件,应用环境这几个概念

预备知识

在application中与环境相关的属性有两个

  • $environmentPath 环境路径,默认为basePathuseEnvironmentPath($path)设置,environmentPath()获取
  • $environmentFile,环境文件名,默认是.env, loadEnvironmentFrom($file)设置,environmentFile()获取
  • 获取完整的环境文件的方法是environmentFilePath(),默认返回项目根目录/.env这个文件

与环境相关的两个bootstrapper

LoadEnvironmentVariables 加载环境变量,将环境文件中的配置写到全局变量$_ENV和$_SERVER中,其实这个配置是为下面的加载配置服务的,可以在配置文件中使用env来读取环境文件中定义的值
LoadConfiguration 加载配置,读取/config下面所有的配置文件,放到$Aapp['config']中,以便在任何地方可以读取相关配置,其中config/app.php这个文件是必须要定义的

加载环境变量LoadEnvironmentVariables

  1. 当配置文件缓存了就不用执行,会跳过这一步,也就是说LoadEnvironmentVariables是为配置文件服务的
  2. 第一个特殊的环境变量APP_ENV, 它决定着应用环境和将哪个环境文件中的值放到全局常量$_ENV和$_SERVER中,环境文件中的配置可以在配置文件中使用env()的方式获取
  3. 根据env('APP_ENV')找到相应用环境文件,使用第三方库Dotenv将该环境文件中的配置保存到$_ENV和$_SERVER中,查看源代码,实际上使用apache中的apache_setenv函数或php的putenv函数,另外存在$_ENV和$_SERVER这两个全局常量中

如何设置环境变量APP_ENV?

应用有console和web两种运行方式,在console命令行工作方式使用 --env来指定当前应用环境,在web运行方式时,一般在web服务器中指定,如apache中 使用SetEnv APP_ENV xxxx 如果使用homestead环境,可以

    variables:
        - key: 'APP_ENV'
          value: 'home'

如果指定了APP_ENV这个环境变量,如env('APP_ENV')的值为home,那么环境文件就是 项目根目录/.env.home
也就是说不同的环境APP_ENV对应不同的环境文件

总结

总结1:如果定义APP_ENV这个环境变量,如env('APP_ENV')的值为wang, 就将么环境文件为 .env.wang里的配置转为全局常量$_ENV和$_SERVER中
总结2:如果没用定义APP_ENV这个环境变量,那么就将.env这个文件中的配置保存全局常量$_ENV和$_SERVER中
总结3:如果上面两种都没有,一般会报错,laravel默认也可以执行,不捕获这个错误

应用环境

设置应用环境: detectEnvironment(Closure $callback),最终保存在$app['env']中
获取应用环境: environment()
判断是否是local环境: isLocal()
判断是否是test环境:runningUnitTests()

在哪里设置应用环境呢,laravel在LoadConfiguration这个bootstrapper的bootstrap()中定义的,事实上它是读取配置文件config/app下面env的值,如果没设就返回production

在配置文件app.env中指定,'env' => env('APP_ENV', 'production'), 它的意思是,如果指定了APP_ENV,那么应用环境就是APP_ENV的值,没有指定,就是production。如果在app.env中也没有指定,那么laravel在LoadConfiguration时中会将其指定为production,也就是$app['env']有三个地方可以指定

课后思考

  1. 应用环境是不是必须要指定?
  2. 指定应用环境的几个步骤

advance100
599 声望80 粉丝

0he1.com在线课堂